package com.king.oa.base;

import java.lang.reflect.ParameterizedType;
import java.util.Collections;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.transaction.annotation.Transactional;

import com.king.oa.domain.PageBean;
import com.king.oa.util.QueryHelper;

// @Transactional注解可以被继承
@Transactional
@SuppressWarnings("unchecked")
public class DaoSupportImpl<T> implements DaoSupport<T>{

	@Resource
	private SessionFactory sessionFactory;
	private Class<T> clazz;
	
	public DaoSupportImpl(){
		//使用反射技术得到T的真是类型
		ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前new的对象的泛型的父类类型
		this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真是类型
	}
	
	
	/**
	 * 获取当前可用的Session
	 * 
	 * @return
	 */
	protected Session getSession(){
		return sessionFactory.getCurrentSession();
	}
	
	@Override
	public void save(T entity) {
		getSession().save(entity);
	}

	@Override
	public void delete(Long id) {
		Object obj = findById(id);
		if(obj != null){
			getSession().delete(obj);
		}
	}

	@Override
	public void update(T entity) {
		getSession().update(entity);
	}

	@Override
	public T findById(Long id) {
		if(id==null)
			return null;
		return (T) getSession().get(clazz, id);
	}

	@Override
	public List<T> findByIds(Long[] ids) {
		if(ids == null||ids.length == 0)
			return Collections.EMPTY_LIST;
		
		return getSession().createQuery(//--
				"FROM "+ clazz.getSimpleName() +" WHERE id IN (:ids)")//--
				.setParameterList("ids", ids)
				.list();
	}

	@Override
	public List<T> findAll() {
		return getSession().createQuery(//--
				"FROM " + clazz.getSimpleName())//--
				.list();
	}


	//公众的查询分页信息的方法
	@Deprecated
	public PageBean findPageBean(int pageNum, int pageSize, String hql,
			List<Object> parameters) {
		
		//查询本页的数据列表
		Query listQuery = getSession().createQuery(hql); // 创建查询对象
		if(parameters != null){ // 设置参数
			for(int i = 0;i < parameters.size();i++){
				listQuery.setParameter(i, parameters.get(i));
			}
		}
			
		listQuery.setFirstResult((pageNum - 1) * pageSize);
		listQuery.setMaxResults(pageSize);
		List<?> recordList = listQuery.list();// 执行查询
				
		// 查询总记录数量
		Query countQuery = getSession().createQuery("SELECT COUNT(*) " + hql);
		if(parameters != null){ // 设置参数
			for(int i = 0;i < parameters.size();i++){
				countQuery.setParameter(i, parameters.get(i));
			}
		}
		
		Long count = (Long) countQuery.uniqueResult();
		
		return new PageBean(pageNum, pageSize, count.intValue(), recordList);
	}

	//公众的查询分页信息的方法(v4版)
	@Override
	public PageBean findPageBean(int pageNum, int pageSize,
			QueryHelper queryHelper) {

		//参数列表
		List<Object> parameters = queryHelper.getParameters();
		
		//查询本页的数据列表
		Query listQuery = getSession().createQuery(queryHelper.getListQueryHql()); // 创建查询对象
		if(parameters != null){ // 设置参数
			for(int i = 0;i < parameters.size();i++){
				listQuery.setParameter(i, parameters.get(i));
			}
		}
			
		listQuery.setFirstResult((pageNum - 1) * pageSize);
		listQuery.setMaxResults(pageSize);
		List<?> recordList = listQuery.list();// 执行查询
				
		// 查询总记录数量
		Query countQuery = getSession().createQuery(queryHelper.getCountQueryHql());
		if(parameters != null){ // 设置参数
			for(int i = 0;i < parameters.size();i++){
				countQuery.setParameter(i, parameters.get(i));
			}
		}
		
		Long count = (Long) countQuery.uniqueResult();
		
		return new PageBean(pageNum, pageSize, count.intValue(), recordList);
		
	}

}
